查看原文
其他

C++之旅-string

守望先生 编程珠玑 2019-04-02

前言

标准库类型string表示可变长字符序列,使用之前需要包含string头文件,它定义在命名空间std中。

string初始化

string s1   //默认初始化,s1是一个空串
string s2(s1)    //S2是s1的副本
string s2 
= s1    //等价于s2(s1)
string s3 = ("hello"//s3是“hello”的副本,但不包含最后的空字符 
string s3("hello")   //等价于s3 = ("hello")
string s4(n,'c')    //s4初始化为连续n个c字符组成的串

其中string s4的初始化等价于下面的语句:

string temp(8,'a');
string s5 = temp;

如果使用=初始化一个变量,执行的是拷贝初始化,编译器把等号右边的初始值拷贝到新创建的对象中,否则为直接初始化

string操作

读写string

可以使用标准库中的iostream来读写string对象。
例如:

#include<iostream>
using namespace std;
int main()
{
    string s;
    cin >> s;   //将控制台输入存储到s中
    cout<< s << endl//打印s的内容
    return 0;
}

运行程序,在控制台输入: Hello world。
输入和输出结果如下:

 Hello world
Hello

可以看到,string对象会自动忽略开头的空白(空格符,换行符,制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白。
另外,string对象的输入输出操作会返回运算符左侧运算对象,并将其作为结果:

cin >> s1 >> s2;

也就是说,对于上面的表达式,在运算cin >> s1之后,返回cin,继续运算cin >> s2。最终会将第一个输入读到s1,第二个输入读到s2中。

读取整行

整行读取可以使用getline函数。getline的读取会保留输入时的空白,遇到换行符才结束(换行符也被读取进来了)。遇到空行时,读取到的是空串。

#include<iostream>
using namespace std;
int main()
{
    string line;
    if(getline(cin,line))
    {
        cout<< line;
        cout<< line;
    }
    return 0;
}

输入输出结果:

    HELLO                                                                              
    HELLO    HELLO   

可以看到:

  • 空字符也被读取进来了

  • 换行符没有存储在string中,line两次打印被打印在了同一行

字符串比较

比较s1和s2所含的字符是否完全一样,可以使用下面的方式:

s1 == s2

string的大小比较是利用字符在字典序比较:

s1 > s2
s1 <= s2

判断string对象是否为空串

例如:

s.empty()  //返回布尔类型值

获取string对象长度

例如:

s.size()

注意:这个表达式的返回值类型为string::size_type,它是一个无符号类型,因此避免用有符号类型,例如int来存储或者比较其长度。一个无符号数和一个负的有符号数比较大小时,有符号数会被转换为很大的无符号数,因此常常得到的结果就是这个无符号数小于这个负的有符号数。(可参考C语言入坑指南-整型的隐式转换与溢出

字符串相加

有以下几种方式:

s1 + s2  //返回s1和s2的内容
s1 + “world”  //返回s1和world的内容

注意:字符字面值和string对象使用+运算符时,两侧运算对象至少一个是string。
下面的操作是非法的:

strings s = "hello" + "world"//非法操作

字符串访问

要访问字符串中的字符,可直接使用下表运算符[],例如:

s[0]   //访问s的第一个字符
s[s.size()-1//访问s的最后一个字符

遍历字符串,可使用for each:

for(auto c : s)     //遍历s中的字符,每个字符赋给c遍历
    cout << c << endl;  //打印c的值

同样也可以使用常规方式:

unsignen int loop ;
for(loop = 0loop < s.size();loop++)
    cout << s[loop] << endl;

总结

  • C++中的string是一个对象,但字符串字面值并不是一个string对象

  • string的size函数返回值为无符号类型

  • string对象的比较可用==等操作符,比较的是字符串内容是否相同

  • 两个字符串字面值不能直接使用+操作符


关注公众号【编程珠玑】,第一时间获取更多原创技术文章



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存